ソート・配列


データの並べかえ
データを並び替えるには、Sort
メソッドを使用します。並び替えに指定できるキーは 3
項目までです。4
項目以上にわたって並べかえを行うときは、並び替え優先順位の下位から順番に並び替えを実行します。
たとえば、並び替えに使用したいキー項目が 5
つあるときは、最初に下位の 3 項目(または2項目)
で並び替え、次に優先順位の高い 2 項目(または3項目)
の並び替えを実行します。
ユーザー設定リストを使用すると、特定の項目を任意の並び順で並び替えを行うこともできます。ユーザー設定リストの設定方法などの詳細はここをクリックしてください。
Sort メソッドの構文は下記のとおりです。
expression.Sort(Key1, Order1, Key2, Type, Order2, Key3, Order3, Header, OrderCustom,
Orientation, SortMethod)
exression
では、ソート範囲を指定します。リスト範囲内の1つのセルを指定するとリスト全体のソートを行うことができます。ソート範囲をリストの一部分に限定する場合は、ソート範囲を指定します。
Sort メソッドの引数の意味は下表のとおりです。
引 数 |
内 容 |
Key 1 〜 3 |
省略可能です。並べ替えのキーとなるフィールドを、文字列または Range
で指定します。 優先順位の高い順から、Key1,Key2,Key3
です。 |
Order 1 〜 3 |
省略可能です。Key 1 〜 3
の各項目の並べかえ方法を指定します。 |
定 数 |
内 容 |
xlAscending |
昇順に並べ替えます。既定値。 |
xlDescending |
降順に並べ替えます。 |
Type |
省略可能です。並び替える要素を指定します。この引数は、ピボットテーブルの並べ替えだけに指定できます。 |
Header |
省略可能です。最初の行がタイトル行であるかどうかを指定します。 |
定 数 |
内 容 |
xlGuess |
範囲の先頭行がタイトル行であるか自動的に判断します。 |
xlNo |
タイトル行はないものと見なし、範囲全体を並べ替え対象とします。既定値。 |
xlYes |
先頭行をタイトル行と見なし、並べ替え対象としません。 |
OrderCustom |
省略可能です。ユーザー設定リストの登録順で並べかえを行うときに1 から始まる整数で、ユーザー設定リストの何番目に使用するリストが表示されているかを指定します。
省略すると、1 (標準) の設定になります。 |
MatchCase |
省略可能です。大文字と小文字を区別するかしないかを指定します。 |
定 数 |
内 容 |
TRUE |
大文字と小文字を区別して並べ替えます |
FALSE |
大文字と小文字を区別しないで並べ替えます |
Orientation |
省略可能です。並び替えの方向を指定します。 |
定 数 |
内 容 |
xlSortRows |
上から下に並べ替えます (行の並べ替え)。 |
xlSortColumn |
左から右に並べ替えます (列の並べ替え)。 |
SortMethod |
省略可能です。 並べ替えの種類を指定します。 |
定 数 |
内 容 |
xlPinYin |
ふりがなを使う |
xlStroke |
ふりがなを使わない |


処理内容:昇順ソート
Sub Sort_1()
Worksheets("Sgeet1").Range("A1").Sort _
Key1:=Range("A2"), Order1:=xlAscending, _
Key2:=Range("B2"), Order2:=xlAscending, _
Key3:=Range("C2"), Order3:=xlAscending, _
Header:=xlGuess, OrderCustom:=1, MatchCase:=False, _
Orientation:=xlTopToBottom, SortMethod:=xlPinYin
End Sub
処理内容:昇順ソート省略型
Sub Sort_2()
Worksheets("Sgeet1").Range("A1").Sort _
Key1:=Range("C3"),Order1:=xlAscending,header:=xlGuess
End Sub
処理内容:降順ソート
Sub Sort_3()
Worksheets("Sgeet1").Range("A1").Sort _
Key1:=Range("A2"),Order1:=xlDescending, _
Key2:=Range("B2"),Order2:=xlDescending, _
Key3:=Range("C2"),Order3:=xlDescending, _
Header:=xlGuess, OrderCustom:=1, MatchCase:=False, _
Orientation:=xlTopToBottom, SortMethod:=xlPinYin
End Sub
処理内容:降順ソート省略型
Sub Sort_4()
Worksheets("Sgeet1").Range("A1").Sort _
Key1:=Range("C3"), Order1:=xlDescending,header:=xlGuess
End Sub
処理内容:範囲を指定してソート
Sub Sort_5()
Worksheets("Sgeet1").Range("A1:C20").Sort _
Key1:=Range("A2"), Order1:=xlAscending, Header:=xlGuess
End Sub
処理内容:ユーザー設定リストの10番目に登録された単語の順番に並べ替え
Sub Sort_6()
Worksheets("Sgeet1").Range("A1").Sort _
Key1:=Range("A2"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=10, MatchCase:=True, Orientation:=xlTopToBottom, _
SortMethod:=xlStroke
End Sub
OrderCustom で、ユーザー設定リストの登録位置を指定します。(例では10番目)


配列の概要
1 配列の宣言
(1) 配列の次元
配列は、データの集合体の一種で、要素数によって一次元配列から多次元配列まであります。
一次元配列は、曜日のように 1
つの項目に複数のデータが格納されている場合の配列形式をいいます。二次元配列は、Excel
のワークシートのように、縦項目と横項目からなる配列形式、三次元配列は、学校の生徒のデータのように、学年・クラス・出席番号という
3 つの要素からなる配列形式をいいます。
(2) 配列名とインデックス番号
配列では、配列として扱うデータ領域を変数による配列名で表し、配列データの格納位置は、インデックス番号(添字)で示されます。インデックス番号は、配列名に続けて格納位置を(
)内に数字で表します。多次元配列の場合は、インデックス番号とインデックス番号の間に「
, (カンマ)」を入れます。
一次元配列 Dim <配列変数名(データ個数)> As <データ型>
Dim Youbi(6) As String '
1 列 7 行の配列
二次元配列 Dim <配列変数名(データ個数,データ個数)>
As <データ型>
Dim Uriage(2,5) As Long '
3 行 6 列の配列
(3) 配列の宣言と領域指定
配列を使用するときは、その旨を宣言する必要があり、配列名とインデックス番号の最大値で領域の大きさを表します。特別な指定をしない限り、インデックス番号の初期値は
0 となりますので、領域数は「データ数 − 1
」ということになります。
配列のインデックス番号の初期値は、モジュールの宣言領域に「Option
Base 1」と指定することによって 1
に変更することもできます。この場合はモジュール内のすべての配列に適用されます。
また、領域の初期値と終了値を「To」で結んで指定すれば任意のインデックス番号を指定することもできます。
一次元配列 Dim <配列名(初期値 To 終了値)> As <データ型>
Dim Youbi(3 To 9) As String '
1 列 7 行の配列
[ 一次元配列の例・・・ 曜日の配列 ]
曜日は、7 つの種類がありますので、領域数は 7 つ、0 〜 6
までのインデックス番号が必要になります。配列を宣言するときは、Youbi
( 6 ) というように指定します。
インデックス番号 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
Youbi |
日 |
月 |
火 |
水 |
木 |
金 |
土 |
[ 二次元配列の例・・・行と列による配列 ]
表の縦軸に部門、横軸に月を表示して売上のデータがある場合のように、行・列からなる配列は
2 次元配列となりす。
たとえば、部門が 3 つある場合、月数を半年分とすると
配列の宣言は Uriage ( 2 , 5 )
というように指定します。配列の位置は( )内の数字のようになります。
インデックス番号 |
0 |
1 |
2 |
3 |
4 |
5 |
0 |
(0,0) |
(0,1) |
(0,2) |
(0,3) |
(0,4) |
(0,5) |
1 |
(1,0) |
(1,1) |
(1,2) |
(1,3) |
(1,4) |
(1,5) |
2 |
(2,0) |
(2,1) |
(2,2) |
(2,3) |
(2,4) |
(2,5) |


2 配列の作成
(1) 静的配列
配列には静的配列(固定配列)と動的配列があります。静的配列とは、配列の添え字(インデックス番号)の値が固定されている配列をいい、配列変数の泉源寺に配列要素のデータ数を予め決めておいて配列を作成する方法です。
一次元配列 Dim <配列名(データ個数)> As <データ型>
Dim Youbi(6) As String
(2) 動的配列
動配列とは、配列の個数をプログラムから変更できる配列をいい、配列の宣言では添え字(インデックス番号)を空欄に設定しておき、配列データを読み込むときに配列の個数を指定する方法です。
一次元配列宣言時 Dim <配列名( )> As <データ型>
Dim Seito() As Integer
配列領域の指定時 Redim <配列名(データ個数)> As
<データ型>
Ninzuu = InputBox("人数を入力してください。")
Redim Seito(Ninzuu) As Integer
MsgBox UBound(Seito) '
Ninzuu の値を表示
(3) Array 関数による一次元配列
Array
関数は、一次元配列を作成する関数で、この中に格納するデータも併せて作成することができます。Array
関数は、Variant 型の変数のみに対して指定できます。
配列の宣言 Dim <配列変数名> As Variant
Dim Youbi As Variant
配列の作成 <配列変数名> = Array(<配列にするデータ>)
Youbi = Array("日","月","火","水","木","金","土")
MsgBox Youbi (3) '
「水」を表示
配列の利用
Option Base 1
Sub Array_1()
Dim Youbi As Variant
Youbi = Array("日","月","火","水","木","金","土")
Worksheets("Sheet1").Select
For R = 1 To 7
Cells(R,1).Value = Youbi (R)
Next R
End Sub


3 配列のサイズを求める
配列のサイズは、配列の終了値から初期値を差し引いて 1
を加えて算出します。算出される結果は、Option Base
の設定内容によって異なりますので注意が必要です。
(1) 配列の終了値の取得(UBound)
Dim myData(6) As Integer
MsgBox UBound(myData) ' Option Base 0 → 6
,Option Base 1 → 6
(2) 配列の初期値の取得(LBound)
Dim myData(6) As Integer
MsgBox LBound(myData) ' Option Base 0 → 0 ,Option
Base 1 → 1
(3) 配列のサイズの取得(UBound-LBound+1)
Dim myData(6) As Integer
MsgBox UBound(myData) - LBound(myData) + 1 '
Option Base 0 → 7 ,Option Base 1 → 6


4 配列の初期化
配列の値を初期化するには、Erase ステートメントを使用します。Erase
ステートメントで初期化される内容は下表のとおりです。
配列の型 |
Erase ステートメントの実行結果 |
静的数値配列 |
要素はすべて 0 に設定されます。 |
静的文字列配列(可変長) |
要素はすべて長さ 0 の文字列("")に設定されます。 |
静的文字列配列(固定長) |
要素はすべて 0 に設定されます。 |
静的バリアント型配列 |
要素はすべて Empty 値に設定されます。 |
ユーザー定義型配列 |
各要素は別個の変数として設定されます。 |
オブジェクト配列 |
要素はすべて特別な Nothing に設定されます。 |
配列を初期化するときは、Erase ステートメントと変数名だけを記述します。
Dim Youbi(1 to 7) As String
Dim Data(10,5) As String
Erase Youbi
Erase Data


配列の設定
処理内容:Array関数を使用した配列(変数の型は「Variant」としなければならない)
Option Base 1 'モジュールの先頭に記述
Sub hairetsu_1()
Dim Sihanki As Variant
Sihanki = Array("第一四半期 ","第二四半期 ","第三四半期 ","第四四半期")
Worksheets("Sheet1").Select
For C =1 To 4
Cells(1,C).Value = Sihanki(C)
Next C
End Sub
処理内容:Array関数を使用しない配列
Option Base 1 'モジュールの先頭に記述
Sub hairetsu_2()
Dim Sihanki(4) As String
Sihanki(1) = "第一四半期"
Sihanki(2) = "第二四半期"
Sihanki(3) = "第三四半期"
Sihanki(4) = "第四四半期"
Worksheets("Sheet1").Select
For C =1 To 4
Cells(1,C).Value = Sihanki(C)
Next C
End Sub


処理内容:二次元配列データを配列に読み込み、別のセルに出力します
Option Base 1 'モジュールの先頭に記述
Public myData(7, 3) As Integer
Sub hairetsu_3()
Worksheets("Sheet1").Select
For i = 1 To 7
For j = 1 To 3
myData(i, j) = Cells(i, j).Value
Next j
Next i
For i = 1 To 7
For j = 1 To 3
Cells(i, j + 4) = myData(i, j)
Next j
Next i
End Sub
処理内容:上記の処理をループを使わずに記述します
Option Base 1 'モジュールの先頭に記述
Sub hairetsu_4()
Dim myData As Variant,cAdd As Integer
Dim R As Long,Dim C As Long
Worksheets("Sheet1").Select
myData = Range("A1").CurrentRegion.Value
R = UBound(myData, 1) ' 1 個目の次元の要素数
C = UBound(myData, 2) - 1 ' 2 個目の次元の要素数-1
cAdd = 5 ' 書き込みセルの先頭列番号
Range(Cells(1, cAdd), Cells(R, C + cAdd)).Value = myData
End Sub


処理内容:プログラムでレコード件数を調べてから配列の要素数を指定する(Redim)
Option Base 1 'モジュールの先頭に記述
Sub hairetsu_5()
Dim myData() As Integer
Worksheets("Sheet1").Select
Gyou = Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row
Retsu = Cells(1,ActiveSheet.Columns.Count).End(xlToLeft).Column
Redim myData(Gyou,Retsu)
End Sub
処理内容:配列の値を保持したまま要素数を変更します(Presarve)
(Sheet1とSheet2のデータを結合してSheet3に書き出す)
Option Base 1 'モジュールの先頭に記述
Sub hairetsu_6()
Dim myData() As Integer,Gyou1 As Long,Gyou2 As Long,i As Long
Worksheets("Sheet1").Activate
Gyou1 = Range("A65536").End(xlUp).Row
ReDim myData(Gyou1) ' 配列要素の変更
For i = 1 To Gyou1
myData(i) = Cells(i, 1).Value
Next i
Worksheets("Sheet2").Activate
Gyou2 = Range("A65536").End(xlUp).Row
ReDim Preserve myData(Gyou1 + Gyou2) ' 配列要素の変更
For i = Gyou1 + 1 To Gyou1 + Gyou2
myData(i) = Cells(i-Gyou1, 1).Value
Next i
Worksheets("Sheet3").Activate
For i = LBound(myData) To UBound(myData)
Cells(i, 1).Value = myData(i)
Next i
End Sub
Redimステートメントは配列に格納された値を破棄してしまうので、それを回避して値を保持したまま要素数を変更するには「Presarve」ステートメントを用います。「Presarve」ステートメントは、多次元配列の場合は、最後(右端)の次元に対してだけ有効であるので注意が必要です。

